package com.ccn.qrcode.utils.MD5;

import cn.hutool.crypto.digest.MD5;
import com.ccn.qrcode.common.Constant;
import com.ccn.qrcode.common.QrVersionEnum;

import java.util.ArrayList;
import java.util.List;

/**
 * 数据md5 处理
 * @author tig
 */

public class MD5FileUtils {

    /**
     * 文件进行md5 处理，获取 处理完成之后的点位
     * 8492025238125403
     * @return
     */
    public List<Integer> Md5FileChange(String fileTxt, String codeWords){
        // 如果是第三版本
        int tmpCodeWords = 1;
        if(QrVersionEnum.THREE.getCodeVersion().equals(codeWords)){
            tmpCodeWords = Integer.parseInt(QrVersionEnum.THREE.getCodeWords());
        }
        String fakeData = new MD5().digestHex16(fileTxt);
        List<Integer> fakeList = new ArrayList<>();
        // 获取md5 里面的前 5位与后5位
        for(int i = 0; i < fakeData.length() ; i++){
            // 共有16位，我们拿前5与后5个
            if(i<=Constant.MD5_BEGIN || i > fakeData.length()-Constant.MD5_END){
                // 前后5位数据转换
                int tmpMd5 = md5CharToNum(String.valueOf(fakeData.charAt(i)));
                // md5在转化成版本数据位
                generalSeq(fakeList, tmpMd5, tmpCodeWords);
            }
        }
        return fakeList;
    }

    /**
     * 生成新的顺序数据
     * 0-9 10
     * a-f 6
     */
    public List<Integer> generalSeq(List<Integer> generalList, int tmpMd5, int codeWords){
        // 计算位置, 16 是md5数据值， 17 是md5范围去掉开头与结尾位置  8 是一个码字 8个字节
        int ceil = (int)Math.ceil(((double)tmpMd5 / 17) * codeWords * 8);
        fileList(generalList, ceil);
        return generalList;
    }


    /**
     * 文件上传List
     * @param generalList generalList
     * @param tmpMd5  数据md5
     * @return
     */
    public List<Integer> fileList(List<Integer> generalList, int tmpMd5){
        //去掉重复数值
        if(generalList.contains(tmpMd5)){
            tmpMd5 = tmpMd5+1;
            fileList(generalList, tmpMd5);
        } else if(tmpMd5<11){
            //绕开S形状
            tmpMd5 = tmpMd5+1;
            fileList(generalList, tmpMd5);
        }else{
            generalList.add(tmpMd5);
        }
        return generalList;
    }

    /**
     * MD5 数据 a-f 0-9， 需要吧 a-f 转成对应的数值
     */
    public int md5CharToNum(String md5Num){
        int tmpMd5Num;
        switch (md5Num){
            case "0": tmpMd5Num=1; break;
            case "1": tmpMd5Num=2; break;
            case "2": tmpMd5Num=3; break;
            case "3": tmpMd5Num=4; break;
            case "4": tmpMd5Num=5; break;
            case "5": tmpMd5Num=6; break;
            case "6": tmpMd5Num=7; break;
            case "7": tmpMd5Num=8; break;
            case "8": tmpMd5Num=9; break;
            case "9": tmpMd5Num=10; break;
            case "a": tmpMd5Num=11; break;
            case "b": tmpMd5Num=12; break;
            case "c": tmpMd5Num=13; break;
            case "d": tmpMd5Num=14; break;
            case "e": tmpMd5Num=15; break;
            case "f": tmpMd5Num=16; break;
            default: tmpMd5Num=17;break;
        }
        return tmpMd5Num;
    }










}
